<?php
class SAModeloAuth
{
	private $accesoBD;

	public function __construct (AccesoBD $accesoBD)
	{
		$this->accesoBD = $accesoBD;
	}
	
	public function permitido ($usuario, $accion)
	{
		$retorno = false;
		
		$perfiles  = $this->recuperaPerfilesPorUsuario ($usuario);
		$saaccion  = $this->recuperaAccionPorNombre ($accion);
		$validos   = (count ($perfiles) > 0 && $saaccion instanceof SAAccion);
		
		if ($validos)
		{
			$sql = "SELECT ". SAPermiso::CLAVE_PRIMARIA ." FROM ". SAPermiso::TABLA;
			$sql.= " WHERE ". SAUsuario::CLAVE_PRIMARIA ."=". $usuario;
			$sql.= " AND ". SAPerfil::CLAVE_PRIMARIA ." IN (". implode(",", $perfiles) .") ";
			
			$retorno = ($this->accesoBD->getFilasAfectadas($sql) > 0);
		}
		
		return $retorno;
	}
	
	public function autentica ($login, $password)
	{
		$retorno = null;
		
		$sql = "SELECT ". SAUsuario::CLAVE_PRIMARIA ." FROM ". SAUsuario::TABLA;
		$sql.= " WHERE login='". $login ."' AND password='". $password ."' LIMIT 1";

		$identificador = $this->accesoBD->queryBDCampo($sql);
		
		if ($identificador > 0)
		{
			$retorno = new SAUsuario($this->accesoBD, $identificador);
		}
		
		return $retorno;
	}
	
	public function registraUsuario ($nombre, $login, $password, $administrador = false)
	{
		$retorno = null;

		$valorAdministrador = SAConstantes::NO;
		
		if ($administrador)
		{
			$valorAdministrador = SAConstantes::SI;
		}

		$datos = new SAUsuario($this->accesoBD);
		$datos->setPropiedad("nombre",        $nombre);
		$datos->setPropiedad("login",         $login);
		$datos->setPropiedad("password",      $password);
		$datos->setPropiedad("administrador", $valorAdministrador);

		if ($datos->consolida())
		{ 
			$retorno = $datos;
		}

		return $retorno;
	}
	
	public function registraPerfil ($nombre)
	{
		$retorno = null;

		$datos = new SAPerfil($this->accesoBD);
		$datos->setPropiedad("nombre", $nombre);

		if ($datos->consolida())
		{
			$retorno = $datos;
		}

		return $retorno;
	}
	
	public function registraAccion ($perfil, $accion)
	{
		$retorno = null;

		$datos = new SAAccion($this->accesoBD);
		$datos->setPropiedad(SAPerfil::CLAVE_PRIMARIA, $perfil);
		$datos->setPropiedad("accion", $accion);

		if ($datos->consolida())
		{
			$retorno = $datos;
		}

		return $retorno;
	}
	
	public function registraPermiso ($perfil, $usuario)
	{
		$retorno = null;

		$datos = new SAPermiso($this->accesoBD);
		$datos->setPropiedad(SAPerfil::CLAVE_PRIMARIA, $perfil);
		$datos->setPropiedad(SAUsuario::CLAVE_PRIMARIA, $usuario);

		if ($datos->consolida())
		{
			$retorno = $datos;
		}

		return $retorno;
	}
	
	private function recuperaAccionPorNombre ($accion)
	{
		$retorno = null;
		
        $sql = "SELECT ". SAAccion::CLAVE_PRIMARIA ." FROM ". SAAccion::TABLA;
        $sql.= " WHERE accion='". $accion ."' LIMIT 1";

        $identificador = $this->accesoBD->queryBDCampo($sql);
        
        if ($identificador > 0)
        {
        	$retorno = new SAAccion($this->accesoBD, $identificador);
        }
		
		return $retorno;
	}
	
	private function recuperaPerfilesPorUsuario ($usuario)
	{
		$retorno = array();
		
        $sql = "SELECT ". SAPerfil::CLAVE_PRIMARIA ." FROM ". SAPermiso::TABLA;
        $sql.= " WHERE ". SAUsuario::CLAVE_PRIMARIA ."=". $usuario;

        $resultado = $this->accesoBD->queryBDObjetos ($sql);
        
        foreach ($resultado as $unResultado)
        {
        	array_push ($retorno, $unResultado->getValor (SAPerfil::CLAVE_PRIMARIA));
        }
		
		return $retorno;
	}
}
?>